package services;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import javax.jws.*;
/**
 *
 * @author myusy
 */
@WebService
public class TransactionManager {
    /**
    *Metodo costruttore
     */
    public TransactionManager(){}

     /**
     *Metodo che implementa la prima fase dell'algoritmo 2PC
     * @return esito della prima fase; true se GLOBAL COMMIT, false se GLOBAL ABORT
     */
     @WebMethod
     public boolean beginTransaction(){
        scriviFile("\nPREPARE");
        String res = prepare("PREPARE");
        if(res.compareTo("READY") == 0){
            String res1 = prepare1("PREPARE");
            if(res1.compareTo("READY") == 0){
                String res2 = prepare2("PREPARE");
                if(res2.compareTo("READY") == 0){
                     scriviFile("GLOBAL_COMMIT");
                     return true;
                }else{
                     scriviFile("GLOBAL_ABORT");
                     return false;
                }
            }else {
                 scriviFile("GLOBAL_ABORT");
                return false;
            }
         }else {
             scriviFile("GLOBAL_ABORT");
            return false;
         }
     }
     /**
     *Metodo che implementa la SECONDA fase dell'algoritmo 2PC
     * @return esito della seconda fase; true se COMPLETE
     */
     @WebMethod
     public boolean phase2Transaction(String global_decision){
        String res = decision(global_decision);
        String res1 = decision1(global_decision);
        String res2 = decision2(global_decision);
        //String res2 = "";
        if(res.compareTo(res1)==0 && res1.compareTo(res2)==0){
            scriviFile("COMPLETE");
            return true;
        }else
            return false;
     }
    
    private synchronized String scriviFile(String s){
        String path = "/home/myusy/NetBeansProjects/MiddleWareWebApp/TransactionFile/Transaction.txt";
        try {
          File file = new File(path);
          FileWriter fw;
          if(file.exists())
            fw = new FileWriter(file,true);
          else
            fw = new FileWriter(file);
          BufferedWriter bw = new BufferedWriter(fw);
          bw.write(s+"\n");
          bw.flush();
          bw.close();
        }
        catch(IOException e) {
          e.printStackTrace();
        }
        return s;
    }

   /**
     *Metodo che richiama il metodo prepare sul fornitore di servizi relativo al worker
     * @return
     */
    private String prepare(java.lang.String arg0) {
        clientWS1.ServiceWorkerService service = new clientWS1.ServiceWorkerService();
        clientWS1.ServiceWorker port = service.getServiceWorkerPort();
        return port.prepare(arg0);
    }
/**
     *Metodo che richiama il metodo prepare sul fornitore di servizi relativo al worker
     * @return
     */
    private String prepare1(java.lang.String arg0) {
        clientWS2.ServiceWorker1Service service_1 = new clientWS2.ServiceWorker1Service();
        clientWS2.ServiceWorker1 port = service_1.getServiceWorker1Port();
        return port.prepare1(arg0);
    }
/**
     *Metodo che richiama il metodo prepare sul fornitore di servizi relativo al worker
     * @return
     */
    private String prepare2(java.lang.String arg0) {
        clientWS3.ServiceWorker2Service service_2 = new clientWS3.ServiceWorker2Service();
        clientWS3.ServiceWorker2 port = service_2.getServiceWorker2Port();
        return port.prepare2(arg0);
    }
    /**
     *Metodo che richiama il metodo decision sul fornitore di servizi relativo al worker
     * @return
     */
    private String decision(java.lang.String arg0) {
        clientWS1.ServiceWorkerService service = new clientWS1.ServiceWorkerService();
        clientWS1.ServiceWorker port = service.getServiceWorkerPort();
        return port.decision(arg0);
    }
    /**
     *Metodo che richiama il metodo decision sul fornitore di servizi relativo al worker
     * @return
     */
    private String decision1(java.lang.String arg0) {
        clientWS2.ServiceWorker1Service service_1 = new clientWS2.ServiceWorker1Service();
        clientWS2.ServiceWorker1 port = service_1.getServiceWorker1Port();
        return port.decision1(arg0);
    }
    /**
     *Metodo che richiama il metodo decision sul fornitore di servizi relativo al worker
     * @return
     */
    private String decision2(java.lang.String arg0) {
        clientWS3.ServiceWorker2Service service_2 = new clientWS3.ServiceWorker2Service();
        clientWS3.ServiceWorker2 port = service_2.getServiceWorker2Port();
        return port.decision2(arg0);
    }


}
